package model

import (
	"ginblog/utils/errmsg"
	"gorm.io/gorm"
)

type Category struct {
	ID   uint   `gorm:"primary_key;auto_increment" json:"id"`
	Name string `gorm:"type:varchar(20);not null" json:"name"`
}

// CheckCategory 查询分类是否存在
// @name 传过来的name字符串
// CheckCategory 检查分类名称是否已被使用
// 参数:
//
//	name - 分类名称，用于查询数据库中是否存在相同名称的分类
//
// 返回值:
//
//	code - 状态码，表示分类名称是否已被使用
func CheckCategory(name string) (code int) {
	// 初始化Category类型变量cate，用于存储查询结果
	var cate Category

	// 查询数据库中是否存在名称为name的分类，只选择id字段
	// 这里使用Select("id")是为了提高查询效率，只获取必要的数据
	db.Select("id").Where("name = ?", name).First(&cate)

	// 检查查询结果，如果cate的ID大于0，说明存在相同名称的分类
	if cate.ID > 0 {
		// 返回错误码，表示分类名称已被使用
		return errmsg.ERROR_CATENAME_USED
	}

	// 如果没有找到相同名称的分类，返回成功码
	return errmsg.SUCCESS
}

// CreateCate 新增分类
// CreateCate 创建分类
// 参数:
//
//	data *Category: 指向要创建的分类的数据结构
//
// 返回值:
//
//	int: 返回错误代码，500表示创建失败，200表示创建成功
func CreateCate(data *Category) int {
	// 使用db创建分类数据
	err := db.Create(&data).Error
	// 如果创建过程中出现错误
	if err != nil {
		// 返回错误代码500
		return errmsg.ERROR // 500
	}
	// 如果创建成功，返回成功代码200
	return errmsg.SUCCESS
}

// GetCateInfo 查询单个分类信息
// GetCateInfo 根据类别ID获取类别信息。
// 参数:
//
//	id - 类别的唯一标识符。
//
// 返回值:
//
//	Category - 类别信息结构体。
//	int - 错误代码，表示操作是否成功。
func GetCateInfo(id int) (Category, int) {
	var cate Category
	// 使用类别ID查询数据库中的类别信息。
	db.Where("id = ?", id).First(&cate)
	// 返回查询到的类别信息和成功错误代码。
	return cate, errmsg.SUCCESS
}

// GetCate 查询分类列表
// GetCate 获取分类信息列表和总记录数
// 参数:
//
//	pageSize - 每页记录数
//	pageNum - 当前页数
//
// 返回值:
//
//	[]Category - 分类信息列表
//	int64 - 总记录数
func GetCate(pageSize int, pageNum int) ([]Category, int64) {
	// 初始化分类信息切片和总记录数变量
	var cate []Category
	var total int64

	// 查询数据库，限制查询结果的数量并设置偏移量以实现分页
	err = db.Find(&cate).Limit(pageSize).Offset((pageNum - 1) * pageSize).Error

	// 查询总记录数
	db.Model(&cate).Count(&total)

	// 检查错误，如果存在且不是记录未找到的错误，则返回空列表和0记录数
	if err != nil && err != gorm.ErrRecordNotFound {
		return nil, 0
	}

	// 返回分类信息列表和总记录数
	return cate, total
}

// EditCate 编辑分类信息
// EditCate 编辑分类信息
// 参数:
//
//	id - 需要编辑的分类的ID
//	data - 包含新的分类信息的指针
//
// 返回值:
//
//	int - 编辑操作的结果代码
func EditCate(id int, data *Category) int {
	// 初始化一个空的分类结构体
	var cate Category
	// 创建一个空的映射，用于存储需要更新的分类信息
	var maps = make(map[string]interface{})
	// 将新的分类名称添加到映射中
	maps["name"] = data.Name

	// 使用db对象更新数据库中ID为$id$的分类记录
	// 如果更新过程中出现错误，则返回错误代码
	err = db.Model(&cate).Where("id = ? ", id).Updates(maps).Error
	if err != nil {
		return errmsg.ERROR
	}
	// 如果更新成功，则返回成功代码
	return errmsg.SUCCESS
}

// DeleteCate 删除分类
// DeleteCate 删除一个分类
// 参数:
//
//	id - 需要删除的分类的ID
//
// 返回值:
//
//	删除操作的状态码，成功返回errmsg.SUCCESS，失败返回errmsg.ERROR
func DeleteCate(id int) int {
	// 初始化一个Category类型的变量cate
	var cate Category
	// 通过ID删除分类，这是一个高效的删除操作，不会级联删除关联的数据
	err = db.Where("id = ? ", id).Delete(&cate).Error
	// 检查删除操作是否有错误
	if err != nil {
		// 如果有错误，返回错误状态码
		return errmsg.ERROR
	}
	// 如果没有错误，返回成功状态码
	return errmsg.SUCCESS
}
